כיצד לצור מחרוזות טקסט אקראיות ייחודיות, בהנחה שכל המחרוזות הישנות שנוצרו שמורות בטבלה במסד?

4 תשובות

avatar ענה משתמש_218762 ב 20 למאי 2012 #

uniqid
או

function strRand($length=11){
  return substr(str_shuffle(str_repeat('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_',5)), 0, $length);
}
  /* or: */
function uuid(){
  return sprintf( '%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
  mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ),
  mt_rand( 0, 0x0fff ) | 0x4000,
  mt_rand( 0, 0x3fff ) | 0x8000,
  mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ) );
}

ותגדיר במסד unique

avatar ענה intval ב 20 למאי 2012 #

אני הייתי הולך על עמודה עם autoincrement, עמודה עם כמה 3-4 תווים רנדומליים שכן יכולים לחזור על עצמם (salt) ועוד עמודה שהיא בעצם המחרוזת הזו שמורכבת מ

sha1(autoincrement _id . salt . constant_string )

ככה לא צריך לבדוק את קיומה של מחרוזת כלשהי במסד.

avatar ענה משתמש_218762 ב 20 למאי 2012 #

@intval
מחשבה נכונה ויצירתית אבל מאוד מגבילה, sha1 מחזירה מחרוזת קבועה של 64 תווים.
אני חושב שהסיכוי שתחזור אותה מחרוזת מstrRand לא תחזיר אותה מחרוזת (אפילו בלי בדיקה במסד), כי יש 11 תווים (ברירת מחדל) בחזקת 320 תווים = (64^11) * 5 = 368,934,881,474,191,032,320 מחרוזות, (לא בטוח שזה נכון, אבל משהו בסגנון), אפילו יוטיוב עובדים ככה ויש להם מעל 2 מליארד סרטונים[*] ולא נראה לי שהמערכת שהוא בונה צריכה יותר מזה ומקסימום אם יש התנגשות יש לו unique על העמודה שתגדיר תנאי חדש משהו בסגנון הזה:

/*
  CREATE TABLE IF NOT EXISTS `test_tbl` (
    `ID` int(11) NOT NULL AUTO_INCREMENT,
    `rand_string` varchar(11) NOT NULL,
    PRIMARY KEY (`ID`),
    UNIQUE KEY `rand_string` (`rand_string`)
  );
*/

  function strRand($length=11){
    return substr(str_shuffle(str_repeat('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_',5)), 0, $length);
  }

  while(1){
    mysql_query(sprintf("INSERT INTO `test_tbl` (`rand_string`) VALUE ('%s');", strRand())) or die(mysql_error());
    if(mysql_affected_rows() == 1){
      break;
    }
  }

avatar ענה intval ב 20 למאי 2012 #

יש עוד פונקציות hashing שאפשר לקבל מהם מחרוזת בכל אורך שתרצה.

הבעיה עם strRand שבכל זאת צריך לבדוק.
למרות שאפשר לא לבדוק ופשוט לטפוס שגיאות מהמסד. וגם הרנדום הוא לא כזה רנדום ככה שלא הייתי מסתמך עליו :)

הכל תלוי בשביל מה המחרוזת הזו בכלל.
אבל באופן כללי אתה צודק.

---
אצל יוטיוב היא לא רנדומלית. זה מספר עולה באיזהשהו base256